package d2_lambda;

import d1_arrays.Student;

import java.util.Arrays;
import java.util.Comparator;
import java.util.function.IntToDoubleFunction;

public class LambdaTest02 {
    public static void main(String[] args) {
        //目标:简化之间的代码
        //4、修改数组中的每个数据, 再存入
        double[] scores = {99.5, 90, 59.5, 78, 98, 55};
        //需求: 为每个分数加分10分----->典型的对象回调思想
        //注意是保留的是方法的括号
        Arrays.setAll(scores, new IntToDoubleFunction() {
            @Override
            public double applyAsDouble(int value) {
                return scores[0] + 10;
            }
        });

        Arrays.setAll(scores, (int index) -> {
            return scores[0] + 10;
        });

        Arrays.setAll(scores, (value) -> {
            return scores[0] + 10;
        });

        Arrays.setAll(scores, value -> {
            return scores[0] + 10;
        });

        Arrays.setAll(scores, value -> scores[0] + 10);


        //展示数组
        System.out.println(Arrays.toString(scores));
        //5、Arrays类提供的对数组进行排序的操作
        Arrays.sort(scores);//默认升序(由小到大)
        //展示数组
        System.out.println(Arrays.toString(scores));

        //目标:给存储对象的数组进行排序
        Student[] students = new Student[4];
        //进行数据封装
        students[0] = new Student("周芷若", 21, '女', 169.3);
        students[1] = new Student("殷素素", 38, '女', 172.2);
        students[2] = new Student("小昭", 19, '女', 168.5);
        students[3] = new Student("张无忌", 23, '男', 183.5);

        //自定义排序规则方式一: 让对象所在的类实现比较规则接口Comparable, 重写compareTo方法, 来指定比较规则
        Arrays.sort(students);//sort底层会默认,用数组的第一个对象调用类重写的compareTo方法,跟第二个对象进行比较

        //自定义比较规则二: sort存在重载方法, 支持自带Comparator比较器对象来直接指定比较规则(优先)
        // public static <T> void sort(T[] a, Comparator<? super T> c)
        Arrays.sort(students, new Comparator<Student>() {
            @Override
            public int compare(Student o1, Student o2) {
                return Double.compare(o1.getHeight(), o2.getHeight());
            }
        });

        //两个参数不能省---->担心一个参数属于sort方法,因此只能在一个参数的时候省略
        Arrays.sort(students, (Student o1, Student o2) -> {
            return Double.compare(o1.getHeight(), o2.getHeight());
        });
        //多个参数是,不能省略小括号(担心o1属于sort方法)
        Arrays.sort(students, (o1, o2) -> {
            return Double.compare(o1.getHeight(), o2.getHeight());
        });
        //为什么要搞出Lambda表达式,因为代码过于臃肿-->不是比较好的语言,所以简化一下
        Arrays.sort(students, (o1, o2) -> Double.compare(o1.getHeight(), o2.getHeight()));


    }
}
